UserAdd.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. <template>
  2. <el-drawer
  3. v-model="visible"
  4. :title="editor ? t('Label.EditorUser') : t('Label.AddUser')"
  5. size="650"
  6. @close="close"
  7. >
  8. <el-form ref="formRef" :rules="rules" :model="form" label-width="150PX">
  9. <el-form-item :label="$t('Label.UserNames') + ':'">
  10. <el-input v-model.trim="form.username" :placeholder="$t('Placeholder.Input')"></el-input>
  11. </el-form-item>
  12. <el-form-item :label="$t('Label.Name') + ':'">
  13. <el-input v-model="form.name" :placeholder="$t('Placeholder.Input')"></el-input>
  14. </el-form-item>
  15. <el-form-item :label="$t('Label.Email') + ':'">
  16. <el-input v-model.trim="form.email" :placeholder="$t('Placeholder.Input')"></el-input>
  17. </el-form-item>
  18. <!-- <el-form-item :label="$t('Label.Phone') + ':'">-->
  19. <!-- <el-input v-model.trim="form.phone" :placeholder="$t('Placeholder.Input')"></el-input>-->
  20. <!-- </el-form-item>-->
  21. <el-form-item :label="$t('Label.Pwd') + ':'">
  22. <el-input v-model.trim="form.password"></el-input>
  23. </el-form-item>
  24. <el-form-item :label="$t('Label.RoleName') + ':'">
  25. <el-select
  26. v-model="form.roleId"
  27. class="crm_search_down"
  28. :placeholder="$t('Placeholder.Choose')"
  29. >
  30. <el-option
  31. v-for="(item, index) in roleName"
  32. :key="index"
  33. :label="item.name"
  34. :value="item.id"
  35. ></el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item v-if="form.departmentId == '1'" :label="$t('Label.SalesSupervisor') + ':'">
  39. <el-select
  40. v-model="form.pid"
  41. class="crm_search_down"
  42. filterable
  43. :placeholder="$t('Placeholder.Choose')"
  44. @change="selectChange"
  45. >
  46. <el-option
  47. v-for="(item, index) in userSales"
  48. :key="index"
  49. :label="item.name + '(' + item.ibNo + ')'"
  50. :value="item.id"
  51. ></el-option>
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item
  55. v-if="form.departmentId == '1'"
  56. :label="$t('salaryPerformance.salary.item1') + ':'"
  57. >
  58. <el-select
  59. v-model="form.salesType"
  60. class="crm_search_down"
  61. filterable
  62. :placeholder="$t('Placeholder.Choose')"
  63. @change="selectChangesalesType"
  64. >
  65. <el-option :label="$t('salaryPerformance.salary.item2')" :value="1"></el-option>
  66. <el-option :label="$t('salaryPerformance.salary.item3')" :value="2"></el-option>
  67. </el-select>
  68. </el-form-item>
  69. <el-form-item
  70. v-if="form.departmentId == '1'"
  71. :label="$t('salaryPerformance.salary.item3') + ':'"
  72. >
  73. <el-select
  74. v-model="form.leaderId"
  75. class="crm_search_down"
  76. filterable
  77. :placeholder="$t('Placeholder.Choose')"
  78. @change="selectChange"
  79. >
  80. <el-option
  81. v-for="(item, index) in userSales"
  82. :key="index"
  83. :label="item.name + '(' + item.ibNo + ')'"
  84. :value="item.id"
  85. ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item
  89. v-if="form.departmentId == '1'"
  90. :label="$t('salaryPerformance.salary.item4') + ':'"
  91. >
  92. <el-select
  93. v-model="form.salesCommissionRuleId"
  94. class="crm_search_down"
  95. filterable
  96. clearable
  97. :placeholder="$t('Placeholder.Choose')"
  98. @change="selectChange"
  99. >
  100. <el-option
  101. v-for="(item, index) in GetRuleDropdownList"
  102. :key="index"
  103. :label="item.ruleName + '(' + item.kpiStandardName + ')'"
  104. :value="item.id"
  105. ></el-option>
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item
  109. v-if="form.departmentId == '1'"
  110. :label="$t('salaryPerformance.salary.item5') + ':'"
  111. >
  112. <el-input v-model.trim="form.salaryLogin" :placeholder="$t('Placeholder.Input')"></el-input>
  113. </el-form-item>
  114. <el-form-item
  115. v-if="form.departmentId == '1'"
  116. prop="salaryPlatform"
  117. :label="$t('salaryPerformance.salary.item6') + ':'"
  118. >
  119. <el-select
  120. v-model="form.salaryPlatform"
  121. class="crm_search_down"
  122. filterable
  123. :placeholder="$t('Placeholder.Choose')"
  124. @change="selectChange"
  125. >
  126. <el-option label="MT4" value="MT4"></el-option>
  127. <el-option label="MT5" value="MT5"></el-option>
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item :label="$t('Label.Region') + ':'">
  131. <el-select
  132. v-model="form.groupId"
  133. class="crm_search_down"
  134. :placeholder="$t('Placeholder.Choose')"
  135. >
  136. <el-option
  137. v-for="(item, index) in GetState"
  138. :key="index"
  139. :label="Session.Get('lang') == 'cn' ? item.name : item.enName"
  140. :value="item.id"
  141. ></el-option>
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item :label="$t('Label.Nationality') + ':'">
  145. <el-select
  146. v-model="form.country"
  147. class="crm_search_down"
  148. filterable
  149. remote
  150. :placeholder="$t('Placeholder.Choose')"
  151. >
  152. <el-option
  153. v-for="(item, index) in mock_options"
  154. :key="index"
  155. :label="item.enName"
  156. :value="item.code"
  157. ></el-option>
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item prop="areaId" :label="$t('Area.item1') + ':'">
  161. <el-select
  162. v-model="form.areaId"
  163. class="crm_search_down"
  164. :placeholder="$t('Placeholder.Choose')"
  165. >
  166. <el-option
  167. v-for="(item, index) in GetArea"
  168. :key="index"
  169. :label="item.name"
  170. :value="item.id"
  171. ></el-option>
  172. </el-select>
  173. </el-form-item>
  174. <!-- <el-form-item :label="$t('Label.Code') + ':'">-->
  175. <!-- <el-input v-model.trim="form.ibNo" :placeholder="$t('Placeholder.Input')"></el-input>-->
  176. <!-- </el-form-item>-->
  177. <!-- <el-form-item :label="$t('Label.ibNoTemp') + ':'">
  178. <el-input
  179. v-model.trim="form.ibNoTemp"
  180. :placeholder="$t('Placeholder.Input')"
  181. ></el-input>
  182. </el-form-item> -->
  183. <el-form-item v-if="!editor" :label="$t('Enter_info.GroupEmail') + ':'">
  184. <el-select
  185. v-model="form.groupEmail"
  186. class="crm_search_down"
  187. :placeholder="$t('Placeholder.Choose')"
  188. >
  189. <el-option
  190. v-for="(item, index) in groupEmailList"
  191. :key="index"
  192. :label="item.groupName"
  193. :value="item.groupEmail"
  194. ></el-option>
  195. </el-select>
  196. </el-form-item>
  197. <el-form-item prop="entryDate" :label="$t('Label.entryDate') + ':'">
  198. <el-date-picker
  199. v-model="form.entryDate"
  200. type="date"
  201. class="crm_search_down"
  202. value-format="YYYY-MM-DD"
  203. :placeholder="$t('Placeholder.Input')"
  204. >
  205. </el-date-picker>
  206. </el-form-item>
  207. <el-form-item prop="pid" :label="$t('Label.SalesSupervisor1') + ':'">
  208. <el-select
  209. v-model="form.attachId"
  210. class="crm_search_down"
  211. filterable
  212. :placeholder="$t('Placeholder.Choose')"
  213. >
  214. <el-option
  215. v-for="(item, index) in userSales"
  216. :key="index"
  217. :label="item.name + '(' + item.ibNo + ')'"
  218. :value="item.id"
  219. ></el-option>
  220. </el-select>
  221. </el-form-item>
  222. <el-form-item prop="entryStatus" :label="$t('Label.EmploymentStatus') + ':'">
  223. <el-select
  224. v-model="form.entryStatus"
  225. class="crm_search_down"
  226. :placeholder="$t('Placeholder.Choose')"
  227. >
  228. <el-option :label="$t('State.employmentStatus1')" :value="1"></el-option>
  229. <el-option :label="$t('State.employmentStatus2')" :value="2"></el-option>
  230. </el-select>
  231. </el-form-item>
  232. <el-form-item v-if="!user.merchantId" :label="$t('Label.Merchant') + ':'">
  233. <el-switch
  234. v-model="form.isMerchantAdmin"
  235. class="crm_switch"
  236. :active-value="1"
  237. :inactive-value="0"
  238. :active-text="$t('Btn.Yes')"
  239. :inactive-text="$t('Btn.No')"
  240. active-color="#368FEC"
  241. inactive-color="#EB3F57"
  242. >
  243. </el-switch>
  244. </el-form-item>
  245. <el-form-item :label="$t('Label.LoginState') + ':'">
  246. <el-switch
  247. v-model="form.valid"
  248. class="crm_switch"
  249. :active-value="1"
  250. :inactive-value="0"
  251. :active-text="$t('Btn.Yes')"
  252. :inactive-text="$t('Btn.No')"
  253. active-color="#368FEC"
  254. inactive-color="#EB3F57"
  255. >
  256. </el-switch>
  257. </el-form-item>
  258. <el-form-item :label="$t('Label.IpLimit') + ':'">
  259. <el-switch
  260. v-model="form.ipLimit"
  261. class="crm_switch"
  262. :active-value="1"
  263. :inactive-value="0"
  264. :active-text="$t('Btn.Yes')"
  265. :inactive-text="$t('Btn.No')"
  266. active-color="#368FEC"
  267. inactive-color="#EB3F57"
  268. >
  269. </el-switch>
  270. </el-form-item>
  271. <el-form-item v-show="form.ipLimit" :label="$t('Label.limitIp') + ':'">
  272. <el-input v-model.trim="form.limitIp" :placeholder="$t('Placeholder.Input')"></el-input>
  273. </el-form-item>
  274. </el-form>
  275. <template #footer>
  276. <el-button type="primary" @click="confirm">{{ $t('Btn.Confirm') }}</el-button>
  277. </template>
  278. </el-drawer>
  279. </template>
  280. <script setup lang="ts">
  281. import { ref, reactive, computed, watch, onMounted, inject } from 'vue'
  282. import { useI18n } from 'vue-i18n'
  283. import type { FormInstance, FormRules } from 'element-plus'
  284. import ServiceSalary from '@/service/salaryPerformance'
  285. import ServiceMarket from '@/service/marketing'
  286. import ServiceUser from '@/service/user'
  287. import Config from '@/config/index'
  288. import { safeGetUser } from '@/utils/safeJson'
  289. const { Code } = Config
  290. const { t } = useI18n()
  291. const Session = inject('session')
  292. const pigeon = inject('pigeon')
  293. interface Props {
  294. dialogInfoTradingAdd: boolean
  295. editor?: string
  296. myInfo?: any
  297. formList?: any
  298. }
  299. const props = withDefaults(defineProps<Props>(), {
  300. dialogInfoTradingAdd: false,
  301. editor: '',
  302. myInfo: null,
  303. formList: null,
  304. })
  305. const emit = defineEmits<{
  306. (e: 'update:dialogInfoTradingAdd', value: boolean): void
  307. (e: 'confirmToReload'): void
  308. (e: 'close'): void
  309. }>()
  310. // Refs
  311. const formRef = ref<FormInstance>()
  312. const visible = ref(props.dialogInfoTradingAdd)
  313. // Reactive data
  314. const form = reactive({})
  315. const roleName = ref([])
  316. const userSales = ref([])
  317. const GetRuleDropdownList = ref([])
  318. const GetRuleDropdown = ref([])
  319. const GetState = ref([])
  320. const GetArea = ref([])
  321. const mock_options = ref([])
  322. const groupEmailList = ref([])
  323. const rules = ref<FormRules>({
  324. areaId: [
  325. {
  326. required: true,
  327. message: t('Placeholder.Choose'),
  328. trigger: 'change',
  329. },
  330. ],
  331. })
  332. // Computed
  333. const GetRuleDropdownListComputed = computed(() => {
  334. return GetRuleDropdown.value.filter((item: any) => item.salesType == form.salesType)
  335. })
  336. const user = computed(() => {
  337. return safeGetUser(Session)
  338. })
  339. const role_system = computed(() => {
  340. const user = JSON.parse(Session.Get('user', true) || '{}')
  341. return user.departmentId == null && user.roleName == 'ROLE_SYSTEM'
  342. })
  343. // Methods
  344. const selectChangesalesType = (val: number) => {
  345. form.salesCommissionRuleId = null
  346. GetRuleDropdownList.value = GetRuleDropdown.value.filter((item: any) => item.salesType == val)
  347. }
  348. const getRoleList = async () => {
  349. let res = await ServiceUser.roleNameList({})
  350. if (res.code == Code.StatusOK) {
  351. roleName.value = res.data
  352. } else {
  353. pigeon.MessageError(res.msg)
  354. }
  355. }
  356. // 获取邮箱组别列表
  357. const getGroupEmailList = async () => {
  358. try {
  359. let res = await ServiceUser.getGroupEmailList({})
  360. if (res.code == Code.StatusOK) {
  361. groupEmailList.value = res.data
  362. } else {
  363. // 使用 Element Plus 的消息提示或其他消息组件
  364. pigeon.MessageError(res.msg || t('Msg.Error'))
  365. }
  366. } catch (error) {
  367. console.error('获取邮箱组别列表失败:', error)
  368. pigeon.MessageError(t('Msg.NetworkError'))
  369. }
  370. }
  371. // 获取销售主管列表
  372. const getRoleSuperiorList = async () => {
  373. try {
  374. let res = await ServiceUser.userSales({})
  375. if (res.code == Code.StatusOK) {
  376. userSales.value = res.data
  377. } else {
  378. pigeon.MessageError(res.msg || t('Msg.Error'))
  379. }
  380. } catch (error) {
  381. console.error('获取销售主管列表失败:', error)
  382. pigeon.MessageError(t('Msg.NetworkError'))
  383. }
  384. }
  385. // 获取薪资绩效规则下拉
  386. const getsalesCommissionRuleDropdown = async () => {
  387. let res = await ServiceSalary.salesCommissionRuleDropdown({})
  388. if (res.code == Code.StatusOK) {
  389. GetRuleDropdown.value = res.data
  390. form.salesType = Number(form.salesType) || null
  391. GetRuleDropdownList.value = GetRuleDropdown.value.filter(
  392. (item: any) => item.salesType == form.salesType
  393. )
  394. } else {
  395. pigeon.MessageError(res.msg)
  396. }
  397. }
  398. // 获取角色地区信息
  399. const getDepartmentState = async () => {
  400. try {
  401. let res = await ServiceUser.userGroupGet({})
  402. if (res.code == Code.StatusOK) {
  403. GetState.value = res.data
  404. } else {
  405. pigeon.MessageError(res.msg || t('Msg.Error'))
  406. }
  407. } catch (error) {
  408. console.error('获取角色地区信息失败:', error)
  409. pigeon.MessageError(t('Msg.NetworkError'))
  410. }
  411. }
  412. // 获取角色区域信息
  413. const getArealListUP = async () => {
  414. try {
  415. let res = await ServiceUser.arealListUP({})
  416. if (res.code == Code.StatusOK) {
  417. GetArea.value = res.data
  418. } else {
  419. pigeon.MessageError(res.msg || t('Msg.Error'))
  420. }
  421. } catch (error) {
  422. console.error('获取角色区域信息失败:', error)
  423. pigeon.MessageError(t('Msg.NetworkError'))
  424. }
  425. }
  426. // 获取国家列表
  427. const getCountry = async () => {
  428. try {
  429. let res = await ServiceMarket.Country({})
  430. if (res.code == Code.StatusOK) {
  431. mock_options.value = res.data
  432. } else {
  433. pigeon.MessageError(res.msg || t('Msg.Error'))
  434. }
  435. } catch (error) {
  436. console.error('获取国家列表失败:', error)
  437. pigeon.MessageError(t('Msg.NetworkError'))
  438. }
  439. }
  440. // 提交
  441. const confirm = () => {
  442. if (!formRef.value) return
  443. formRef.value.validate((valid) => {
  444. if (valid) {
  445. toConfirm()
  446. } else {
  447. return false
  448. }
  449. })
  450. }
  451. const toConfirm = () => {
  452. if (props.editor) {
  453. userUpdate()
  454. } else {
  455. userAdd()
  456. }
  457. }
  458. // 用户update
  459. const userUpdate = async () => {
  460. if (form.departmentId != 1) {
  461. form.pid = null
  462. form.salesType = null
  463. form.salesCommissionRuleId = null
  464. form.leaderId = null
  465. form.salaryLogin = null
  466. form.salaryPlatform = null
  467. }
  468. if (!form.ipLimit) {
  469. form.limitIp = null
  470. }
  471. let res = await ServiceUser.userListUpdate({
  472. ...form,
  473. })
  474. if (res.code == Code.StatusOK) {
  475. emit('confirmToReload')
  476. close()
  477. formRef.value?.resetFields()
  478. // 使用 $pigeon 的替代方式
  479. console.log(t('Msg.Success'))
  480. } else {
  481. console.error(res.msg)
  482. }
  483. }
  484. // 用户add
  485. const userAdd = async () => {
  486. if (form.departmentId != 1) {
  487. form.pid = null
  488. form.salesType = null
  489. form.salesCommissionRuleId = null
  490. form.leaderId = null
  491. form.salaryLogin = null
  492. form.salaryPlatform = null
  493. }
  494. if (!form.ipLimit) {
  495. form.limitIp = null
  496. }
  497. let res = await ServiceUser.userListAdd({
  498. ...form,
  499. })
  500. if (res.code == Code.StatusOK) {
  501. emit('confirmToReload')
  502. formRef.value?.resetFields()
  503. console.log(t('Msg.Success'))
  504. } else {
  505. console.error(res.msg)
  506. }
  507. }
  508. const close = () => {
  509. emit('update:dialogInfoTradingAdd', false)
  510. emit('close')
  511. }
  512. const selectChange = () => {
  513. // 选择变更处理
  514. }
  515. // Lifecycle
  516. onMounted(() => {
  517. // 初始化数据
  518. // getsalesCommissionRuleDropdown()
  519. })
  520. // Watch
  521. watch(
  522. () => props.formList,
  523. (newVal) => {
  524. if (newVal) {
  525. Object.assign(form, newVal)
  526. }
  527. },
  528. { immediate: true }
  529. )
  530. // Watch
  531. watch(
  532. () => props.dialogInfoTradingAdd,
  533. (newVal) => {
  534. visible.value = newVal
  535. if (!newVal && formRef.value) {
  536. formRef.value?.resetFields()
  537. Object.keys(form).forEach((key) => (form[key] = ''))
  538. }
  539. if (newVal) {
  540. getDepartmentState()
  541. getArealListUP()
  542. getCountry()
  543. getRoleList()
  544. getRoleSuperiorList()
  545. getsalesCommissionRuleDropdown()
  546. getGroupEmailList()
  547. if (!form.entryStatus) {
  548. Object.assign(form, { entryStatus: 1 })
  549. }
  550. }
  551. },
  552. { immediate: true }
  553. )
  554. </script>
  555. <style scoped lang="scss"></style>